package main

import (
	"log"
	"os"
	"runtime/pprof"
	"time"
)

// 模拟内存分配
func allocateMemory(size int) []byte {
	log.Printf("分配 %d MB 内存", size)
	return make([]byte, size*1024*1024) // 分配指定MB的内存
}

func memoryIntensiveTask() {
	// 创建一些大对象，模拟内存分配
	var objects [][]byte

	// 分配不同大小的内存块
	for i := 1; i <= 5; i++ {
		obj := allocateMemory(i)
		objects = append(objects, obj)
		time.Sleep(100 * time.Millisecond) // 短暂延迟
	}

	// 释放部分内存
	log.Println("释放部分内存...")
	objects = objects[:2]

	// 再次分配内存
	for i := 3; i <= 7; i++ {
		obj := allocateMemory(i)
		objects = append(objects, obj)
		time.Sleep(100 * time.Millisecond) // 短暂延迟
	}

	log.Println("内存任务完成")
}

func main() {
	// 创建堆内存分析文件
	f, err := os.Create("heap.prof")
	if err != nil {
		log.Fatal("could not create heap profile: ", err)
	}
	defer f.Close()

	log.Println("开始执行内存密集型任务...")

	// 执行内存密集型任务
	for i := 0; i < 3; i++ {
		log.Printf("执行第 %d 轮内存任务", i+1)
		memoryIntensiveTask()
		time.Sleep(500 * time.Millisecond) // 短暂延迟
	}

	// 获取堆内存分析数据
	if err := pprof.WriteHeapProfile(f); err != nil {
		log.Fatal("could not write heap profile: ", err)
	}

	log.Println("堆内存分析数据已写入 heap.prof")

	// 使用方法:
	// 1. 运行程序: go run heap_example.go
	// 2. 分析结果: go tool pprof heap.prof
	// 3. 在pprof交互式命令行中输入: top, web, list等命令
}
